package com.ross.mode.two;

import java.lang.reflect.Proxy;
import java.util.Map;

/**
 * @version 1.0.0
 * @className: MapperProxyFactory
 * @description:
 * @author: zhangjunfa
 * @date: 2023/8/29 11:37
 */
public class MapperProxyFactory<T> {
    private final Class<T> mapperInterface;

    public MapperProxyFactory(Class<T> mapperInterface) {
        this.mapperInterface = mapperInterface;
    }

    public T newInstance(Map<String, String> sqlSession) {
        final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface);
        // newProxyInstance 为指定接口返回代理类的实例，该实例将方法调用分派给指定的调用处理程序。
        // getClassLoader  类加载器
        // interfaces 代理类要实现的接口列表，实际上会被转发给 InvocationHandler 的 invoke() 方法处理。
        // InvocationHandler  表示代理对象的调用处理程序，也是一个实现了 InvocationHandler 接口的对象。InvocationHandler 接口中只
        // 有一个方法 invoke()，当代理对象的方法被调用时，会被传递到 invoke() 方法中进行处理。
        return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]{mapperInterface}, mapperProxy);
    }
}
